;
(function($) {
/*
 * jqGrid  3.4.2 - jQuery Grid
 * Copyright (c) 2008, Tony Tomov, tony@trirand.com
 * Dual licensed under the MIT and GPL licenses
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Date: 2009-03-01 rev 82
 */
    $.fn.jqGrid = function(p) {
        p = $.extend(true, {
                url: "",
                height: 150,
                page: 1,
                rowNum: 20,
                records: 0,
                pager: "",
                pgbuttons: true,
                pginput: true,
                colModel: [],
                rowList: [],
                colNames: [],
                sortorder: "asc",
                sortname: "",
                datatype: "xml",
                mtype: "GET",
                imgpath: "",
                sortascimg: "sort_asc.gif",
                sortdescimg: "sort_desc.gif",
                firstimg: "first.gif",
                previmg: "prev.gif",
                nextimg: "next.gif",
                lastimg: "last.gif",
                altRows: true,
                selarrrow: [],
                savedRow: [],
                shrinkToFit: true,
                xmlReader: {  },
                jsonReader: {  },
                subGrid: false,
                subGridModel: [],
                lastpage: 0,
                lastsort: 0,
                selrow: null,
                beforeSelectRow: null,
                onSelectRow: null,
                onSortCol: null,
                ondblClickRow: null,
                onRightClickRow: null,
                onPaging: null,
                onSelectAll: null,
                loadComplete: null,
                gridComplete: null,
                loadError: null,
                loadBeforeSend: null,
                afterInsertRow: null,
                beforeRequest: null,
                onHeaderClick: null,
                viewrecords: false,
                loadonce: false,
                multiselect: false,
                multikey: false,
                editurl: null,
                search: false,
                searchdata: {  },
                caption: "",
                hidegrid: true,
                hiddengrid: false,
                postData: {  },
                userData: {  },
                treeGrid: false,
                treeGridModel: 'nested',
                treeReader: {  },
                ExpandColumn: null,
                tree_root_level: 0,
                prmNames: { page: "page", rows: "rows", sort: "sidx", order: "sord" },
                sortclass: "grid_sort",
                resizeclass: "grid_resize",
                forceFit: false,
                gridstate: "visible",
                cellEdit: false,
                cellsubmit: "remote",
                nv: 0,
                loadui: "enable",
                toolbar: [false, ""],
                scroll: false,
                multiboxonly: false,
                scrollrows: false,
                deselectAfterSort: true
            }, $.jgrid.defaults, p || {  });
        var grid = {
            headers: [],
            cols: [],
            dragStart: function(i, x) {
                this.resizing = { idx: i, startX: x };
                this.hDiv.style.cursor = "e-resize";
            },
            dragMove: function(x) {
                if (this.resizing) {
                    var diff = x - this.resizing.startX,
                        h = this.headers[this.resizing.idx],
                        newWidth = h.width + diff, hn, nWn;
                    if (newWidth > 25) {
                        if (p.forceFit === true) {
                            hn = this.headers[this.resizing.idx + p.nv];
                            nWn = hn.width - diff;
                            if (nWn > 25) {
                                h.el.style.width = newWidth + "px";
                                h.newWidth = newWidth;
                                this.cols[this.resizing.idx].style.width = newWidth + "px";
                                hn.el.style.width = nWn + "px";
                                hn.newWidth = nWn;
                                this.cols[this.resizing.idx + p.nv].style.width = nWn + "px";
                                this.newWidth = this.width;
                            }
                        } else {
                            h.el.style.width = newWidth + "px";
                            h.newWidth = newWidth;
                            this.cols[this.resizing.idx].style.width = newWidth + "px";
                            this.newWidth = this.width + diff;
                            $('table:first', this.bDiv).css("width", this.newWidth + "px");
                            $('table:first', this.hDiv).css("width", this.newWidth + "px");
                            this.hDiv.scrollLeft = this.bDiv.scrollLeft;
                        }
                    }
                }
            },
            dragEnd: function() {
                this.hDiv.style.cursor = "default";
                if (this.resizing) {
                    var idx = this.resizing.idx;
                    this.headers[idx].width = this.headers[idx].newWidth || this.headers[idx].width;
                    this.cols[idx].style.width = this.headers[idx].newWidth || this.headers[idx].width;
                    // here code to set the width in colmodel
                    if (p.forceFit === true) {
                        this.headers[idx + p.nv].width = this.headers[idx + p.nv].newWidth || this.headers[idx + p.nv].width;
                        this.cols[idx + p.nv].style.width = this.headers[idx + p.nv].newWidth || this.headers[idx + p.nv].width;
                    }
                    if (this.newWidth) {
                        this.width = this.newWidth;
                    }
                    this.resizing = false;
                }
            },
            scrollGrid: function() {
                if (p.scroll === true) {
                    var scrollTop = this.bDiv.scrollTop;
                    if (scrollTop != this.scrollTop) {
                        this.scrollTop = scrollTop;
                        if ((this.bDiv.scrollHeight - scrollTop - $(this.bDiv).height()) <= 0) {
                            if (parseInt(p.page, 10) + 1 <= parseInt(p.lastpage, 10)) {
                                p.page = parseInt(p.page, 10) + 1;
                                this.populate();
                            }
                        }
                    }
                }
                this.hDiv.scrollLeft = this.bDiv.scrollLeft;
            }
        };
        $.fn.getGridParam = function(pName) {
            var $t = this[0];
            if (!$t.grid) {
                return;
            }
            if (!pName) {
                return $t.p;
            } else {
                return $t.p[pName] ? $t.p[pName] : null;
            }
        };
        $.fn.setGridParam = function(newParams) {
            return this.each(function() {
                if (this.grid && typeof(newParams) === 'object') {
                    $.extend(true, this.p, newParams);
                }
            });
        };
        $.fn.getDataIDs = function() {
            var ids = [];
            this.each(function() {
                $(this.rows).slice(1).each(function(i) {
                    ids[i] = this.id;
                });
            });
            return ids;
        };
        $.fn.setSortName = function(newsort) {
            return this.each(function() {
                var $t = this;
                for (var i = 0; i < $t.p.colModel.length; i++) {
                    if ($t.p.colModel[i].name === newsort || $t.p.colModel[i].index === newsort) {
                        $("tr th:eq(" + $t.p.lastsort + ") div img", $t.grid.hDiv).remove();
                        $t.p.lastsort = i;
                        $t.p.sortname = newsort;
                        break;
                    }
                }
            });
        };
        $.fn.setSelection = function(selection, onsr, sd) {
            return this.each(function() {
                var $t = this, stat, pt, ind;
                onsr = onsr === false ? false : true;
                if (selection === false) {
                    pt = sd;
                } else {
                    ind = $($t).getInd($t.rows, selection);
                    pt = $($t.rows[ind]);
                }
                selection = $(pt).attr("id");
                if (!pt.html()) {
                    return;
                }
                if ($t.p.selrow && $t.p.scrollrows === true) {
                    var olr = $($t).getInd($t.rows, $t.p.selrow);
                    var ner = $($t).getInd($t.rows, selection);
                    if (ner >= 0) {
                        if (ner > olr) {
                            scrGrid(ner, 'd');
                        } else {
                            scrGrid(ner, 'u');
                        }
                    }
                }
                if (!$t.p.multiselect) {
                    if ($(pt).attr("class") !== "subgrid") {
                        if ($t.p.selrow) {
                            $("tr#" + $t.p.selrow.replace(".", "\\."), $t.grid.bDiv).removeClass("selected");
                        }
                        $t.p.selrow = selection;
                        $(pt).addClass("selected");
                        if ($t.p.onSelectRow && onsr) {
                            $t.p.onSelectRow($t.p.selrow, true);
                        }
                    }
                } else {
                    $t.p.selrow = selection;
                    var ia = $.inArray($t.p.selrow, $t.p.selarrrow);
                    if (ia === -1) {
                        if ($(pt).attr("class") !== "subgrid") {
                            $(pt).addClass("selected");
                        }
                        stat = true;
                        $("#jqg_" + $t.p.selrow.replace(".", "\\."), $t.rows).attr("checked", stat);
                        $t.p.selarrrow.push($t.p.selrow);
                        if ($t.p.onSelectRow && onsr) {
                            $t.p.onSelectRow($t.p.selrow, stat);
                        }
                    } else {
                        if ($(pt).attr("class") !== "subgrid") {
                            $(pt).removeClass("selected");
                        }
                        stat = false;
                        $("#jqg_" + $t.p.selrow.replace(".", "\\."), $t.rows).attr("checked", stat);
                        $t.p.selarrrow.splice(ia, 1);
                        if ($t.p.onSelectRow && onsr) {
                            $t.p.onSelectRow($t.p.selrow, stat);
                        }
                        var tpsr = $t.p.selarrrow[0];
                        $t.p.selrow = (tpsr == undefined) ? null : tpsr;
                    }
                }

                function scrGrid(iR, tp) {
                    var ch = $($t.grid.bDiv)[0].clientHeight,
                        st = $($t.grid.bDiv)[0].scrollTop,
                        nROT = $t.rows[iR].offsetTop + $t.rows[iR].clientHeight,
                        pROT = $t.rows[iR].offsetTop;
                    if (tp == 'd') {
                        if (nROT >= ch) {
                            $($t.grid.bDiv)[0].scrollTop = st + nROT - pROT;
                        }
                    }
                    if (tp == 'u') {
                        if (pROT < st) {
                            $($t.grid.bDiv)[0].scrollTop = st - nROT + pROT;
                        }
                    }
                }
            });
        };
        $.fn.resetSelection = function() {
            return this.each(function() {
                var t = this, ind;
                if (!t.p.multiselect) {
                    if (t.p.selrow) {
                        $("tr#" + t.p.selrow.replace(".", "\\."), t.grid.bDiv).removeClass("selected");
                        t.p.selrow = null;
                    }
                } else {
                    $(t.p.selarrrow).each(function(i, n) {
                        ind = $(t).getInd(t.rows, n);
                        $(t.rows[ind]).removeClass("selected");
                        $("#jqg_" + n.replace(".", "\\."), t.rows[ind]).attr("checked", false);
                    });
                    $("#cb_jqg", t.grid.hDiv).attr("checked", false);
                    t.p.selarrrow = [];
                }
            });
        };
        $.fn.getRowData = function(rowid) {
            var res = {  };
            if (rowid) {
                this.each(function() {
                    var $t = this, nm, ind;
                    ind = $($t).getInd($t.rows, rowid);
                    if (!ind) {
                        return res;
                    }
                    $('td', $t.rows[ind]).each(function(i) {
                        nm = $t.p.colModel[i].name;
                        if (nm !== 'cb' && nm !== 'subgrid') {
                            res[nm] = $.htmlDecode($(this).html());
                        }
                    });
                });
            }
            return res;
        };
        $.fn.delRowData = function(rowid) {
            var success = false, rowInd, ia;
            if (rowid) {
                this.each(function() {
                    var $t = this;
                    rowInd = $($t).getInd($t.rows, rowid);
                    if (!rowInd) {
                        return false;
                    } else {
                        $($t.rows[rowInd]).remove();
                        $t.p.records--;
                        $t.updatepager();
                        success = true;
                        if (rowid == $t.p.selrow) {
                            $t.p.selrow = null;
                        }
                        ia = $.inArray(rowid, $t.p.selarrrow);
                        if (ia != -1) {
                            $t.p.selarrrow.splice(ia, 1);
                        }
                    }
                    if (rowInd == 1 && success && ($.browser.opera || $.browser.safari)) {
                        $($t.rows[1]).each(function(k) {
                            $(this).css("width", $t.grid.headers[k].width + "px");
                            $t.grid.cols[k] = this;
                        });
                    }
                    if ($t.p.altRows === true && success) {
                        $($t.rows).slice(1).each(function(i) {
                            if (i % 2 == 1) {
                                $(this).addClass('alt');
                            } else {
                                $(this).removeClass('alt');
                            }
                        });
                    }
                });
            }
            return success;
        };
        $.fn.setRowData = function(rowid, data) {
            var nm, success = false;
            this.each(function() {
                var t = this, vl, ind, ttd;
                if (!t.grid) {
                    return false;
                }
                if (data) {
                    ind = $(t).getInd(t.rows, rowid);
                    if (!ind) {
                        return false;
                    }
                    success = true;
                    $(this.p.colModel).each(function(i) {
                        nm = this.name;
                        vl = data[nm];
                        if (vl !== undefined) {
                            if (t.p.treeGrid === true && nm == t.p.ExpandColumn) {
                                ttd = $("td:eq(" + i + ") > span:first", t.rows[ind]);
                            } else {
                                ttd = $("td:eq(" + i + ")", t.rows[ind]);
                            }
                            t.formatter(ttd, t.rows[ind], vl, i, 'edit');
                            success = true;
                        }
                    });
                }
            });
            return success;
        };
        $.fn.addRowData = function(rowid, data, pos, src) {
            if (!pos) {
                pos = "last";
            }
            var success = false, nm, row, td, gi = 0, si = 0, sind, i;
            if (data) {
                this.each(function() {
                    var t = this;
                    row = document.createElement("tr");
                    row.id = rowid || t.p.records + 1;
                    $(row).addClass("jqgrow");
                    if (t.p.multiselect) {
                        td = $('<td></td>');
                        $(td[0], t.grid.bDiv).html("<input type='checkbox'" + " id='jqg_" + rowid + "' class='cbox'/>");
                        row.appendChild(td[0]);
                        gi = 1;
                    }
                    if (t.p.subGrid) {
                        try {
                            $(t).addSubGrid(t.grid.bDiv, row, gi);
                        } catch (e) {
                        }
                        si = 1;
                    }
                    for (i = gi + si; i < this.p.colModel.length; i++) {
                        nm = this.p.colModel[i].name;
                        td = $('<td></td>');
                        t.formatter(td, row, data[nm], i, 'add');
                        t.formatCol($(td[0], t.grid.bDiv), i);
                        row.appendChild(td[0]);
                    }
                    switch (pos) {
                    case 'last':
                        $(t.rows[t.rows.length - 1]).after(row);
                        break;
                    case 'first':
                        $(t.rows[0]).after(row);
                        break;
                    case 'after':
                        sind = $(t).getInd(t.rows, src);
                        sind >= 0 ? $(t.rows[sind]).after(row) : "";
                        break;
                    case 'before':
                        sind = $(t).getInd(t.rows, src);
                        sind > 0 ? $(t.rows[sind - 1]).after(row) : "";
                        break;
                    }
                    t.p.records++;
                    if ($.browser.safari || $.browser.opera) {
                        t.scrollLeft = t.scrollLeft;
                        $("td", t.rows[1]).each(function(k) {
                            $(this).css("width", t.grid.headers[k].width + "px");
                            t.grid.cols[k] = this;
                        });
                    }
                    if (t.p.altRows === true) {
                        if (pos == "last") {
                            if (t.rows.length % 2 == 1) {
                                $(row).addClass('alt');
                            }
                        } else {
                            $(t.rows).slice(1).each(function(i) {
                                if (i % 2 == 1) {
                                    $(this).addClass('alt');
                                } else {
                                    $(this).removeClass('alt');
                                }
                            });
                        }
                    }
                    try {
                        t.p.afterInsertRow(row.id, data);
                    } catch (e) {
                    }
                    t.updatepager();
                    success = true;
                });
            }
            return success;
        };
        $.fn.hideCol = function(colname) {
            return this.each(function() {
                var $t = this, w = 0, fndh = false, gtw;
                if (!$t.grid) {
                    return;
                }
                if (typeof colname == 'string') {
                    colname = [colname];
                }
                $(this.p.colModel).each(function(i) {
                    if ($.inArray(this.name, colname) != -1 && !this.hidden) {
                        w = parseInt($("tr th:eq(" + i + ")", $t.grid.hDiv).css("width"), 10);
                        $("tr th:eq(" + i + ")", $t.grid.hDiv).css({ display: "none" });
                        $($t.rows).each(function(j) {
                            $("td:eq(" + i + ")", $t.rows[j]).css({ display: "none" });
                        });
                        $t.grid.cols[i].style.width = 0;
                        $t.grid.headers[i].width = 0;
                        $t.grid.width -= w;
                        this.hidden = true;
                        fndh = true;
                    }
                });
                if (fndh === true) {
                    gtw = Math.min($t.p._width, $t.grid.width);
                    $("table:first", $t.grid.hDiv).width(gtw);
                    $("table:first", $t.grid.bDiv).width(gtw);
                    $($t.grid.hDiv).width(gtw);
                    $($t.grid.bDiv).width(gtw);
                    if ($t.p.pager && $($t.p.pager).hasClass("scroll")) {
                        $($t.p.pager).width(gtw);
                    }
                    if ($t.p.caption) {
                        $($t.grid.cDiv).width(gtw);
                    }
                    if ($t.p.toolbar[0]) {
                        $($t.grid.uDiv).width(gtw);
                    }
                    $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;
                }
            });
        };
        $.fn.showCol = function(colname) {
            return this.each(function() {
                var $t = this, w = 0, fdns = false, gtw, ofl;
                if (!$t.grid) {
                    return;
                }
                if (typeof colname == 'string') {
                    colname = [colname];
                }
                $($t.p.colModel).each(function(i) {
                    if ($.inArray(this.name, colname) != -1 && this.hidden) {
                        w = parseInt($("tr th:eq(" + i + ")", $t.grid.hDiv).css("width"), 10);
                        $("tr th:eq(" + i + ")", $t.grid.hDiv).css("display", "");
                        $($t.rows).each(function(j) {
                            $("td:eq(" + i + ")", $t.rows[j]).css("display", "").width(w);
                        });
                        this.hidden = false;
                        $t.grid.cols[i].style.width = w;
                        $t.grid.headers[i].width = w;
                        $t.grid.width += w;
                        fdns = true;
                    }
                });
                if (fdns === true) {
                    gtw = Math.min($t.p._width, $t.grid.width);
                    ofl = ($t.grid.width <= $t.p._width) ? "hidden" : "auto";
                    $("table:first", $t.grid.hDiv).width(gtw);
                    $("table:first", $t.grid.bDiv).width(gtw);
                    $($t.grid.hDiv).width(gtw);
                    $($t.grid.bDiv).width(gtw).css("overflow-x", ofl);
                    if ($t.p.pager && $($t.p.pager).hasClass("scroll")) {
                        $($t.p.pager).width(gtw);
                    }
                    if ($t.p.caption) {
                        $($t.grid.cDiv).width(gtw);
                    }
                    if ($t.p.toolbar[0]) {
                        $($t.grid.uDiv).width(gtw);
                    }
                    $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;
                }
            });
        };
        $.fn.setGridWidth = function(nwidth, shrink) {
            return this.each(function() {
                var $t = this, chw = 0, w, cw, ofl;
                if (!$t.grid) {
                    return;
                }
                if (typeof shrink != 'boolean') {
                    shrink = true;
                }
                var testdata = getScale();
                if (shrink !== true) {
                    testdata[0] = Math.min($t.p._width, $t.grid.width);
                    testdata[2] = 0;
                } else {
                    testdata[2] = testdata[1];
                }
                $.each($t.p.colModel, function(i, v) {
                    if (!this.hidden && this.name != 'cb' && this.name != 'subgrid') {
                        cw = shrink !== true ? $("tr:first th:eq(" + i + ")", $t.grid.hDiv).css("width") : this.width;
                        w = Math.floor((IENum(nwidth) - IENum(testdata[2])) / IENum(testdata[0]) * IENum(cw));
                        chw += w;
                        $("table thead tr:first th:eq(" + i + ")", $t.grid.hDiv).css("width", w + "px");
                        $("table:first tbody tr:first td:eq(" + i + ")", $t.grid.bDiv).css("width", w + "px");
                        $t.grid.cols[i].style.width = w;
                        $t.grid.headers[i].width = w;
                    }
                    if (this.name == 'cb' || this.name == 'subgrid') {
                        chw += IENum(this.width);
                    }
                });
                if (chw + testdata[1] <= nwidth || $t.p.forceFit === true) {
                    ofl = "hidden";
                    tw = nwidth;
                } else {
                    ofl = "auto";
                    tw = chw + testdata[1];
                }
                $("table:first", $t.grid.hDiv).width(tw);
                $("table:first", $t.grid.bDiv).width(tw);
                $($t.grid.hDiv).width(nwidth);
                $($t.grid.bDiv).width(nwidth).css("overflow-x", ofl);
                if ($t.p.pager && $($t.p.pager).hasClass("scroll")) {
                    $($t.p.pager).width(nwidth);
                }
                if ($t.p.caption) {
                    $($t.grid.cDiv).width(nwidth);
                }
                if ($t.p.toolbar[0]) {
                    $($t.grid.uDiv).width(nwidth);
                }
                $t.p._width = nwidth;
                $t.grid.width = tw;
                if ($.browser.safari || $.browser.opera) {
                    $("table tbody tr:eq(1) td", $t.grid.bDiv).each(function(k) {
                        $(this).css("width", $t.grid.headers[k].width + "px");
                        $t.grid.cols[k] = this;
                    });
                }
                $t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;

                function IENum(val) {
                    val = parseInt(val, 10);
                    return isNaN(val) ? 0 : val;
                }

                function getScale() {
                    var testcell = $("table tr:first th:eq(1)", $t.grid.hDiv);
                    var addpix = IENum($(testcell).css("padding-left")) +
                        IENum($(testcell).css("padding-right")) +
                            IENum($(testcell).css("border-left-width")) +
                                IENum($(testcell).css("border-right-width"));
                    var w = 0, ap = 0;
                    $.each($t.p.colModel, function(i, v) {
                        if (!this.hidden) {
                            w += parseInt(this.width);
                            ap += addpix;
                        }
                    });
                    return [w, ap, 0];
                }
            });
        };
        $.fn.setGridHeight = function(nh) {
            return this.each(function() {
                var ovfl, ovfl2, $t = this;
                if (!$t.grid) {
                    return;
                }
                if ($t.p.forceFit === true) {
                    ovfl2 = 'hidden';
                } else {
                    ovfl2 = $($t.grid.bDiv).css("overflow-x");
                }
                ovfl = (isNaN(nh) && $.browser.mozilla && (nh.indexOf("%") != -1 || nh == "auto")) ? "hidden" : "auto";
                $($t.grid.bDiv).css({ height: nh + (isNaN(nh) ? "" : "px"), "overflow-y": ovfl, "overflow-x": ovfl2 });
                $t.p.height = nh;
            });
        };
        $.fn.setCaption = function(newcap) {
            return this.each(function() {
                this.p.caption = newcap;
                $("table:first th", this.grid.cDiv).html(newcap);
                $(this.grid.cDiv).show();
            });
        };
        $.fn.setLabel = function(colname, nData, prop, attrp) {
            return this.each(function() {
                var $t = this, pos = -1;
                if (!$t.grid) {
                    return;
                }
                if (isNaN(colname)) {
                    $($t.p.colModel).each(function(i) {
                        if (this.name == colname) {
                            pos = i;
                            return false;
                        }
                    });
                } else {
                    pos = parseInt(colname, 10);
                }
                if (pos >= 0) {
                    var thecol = $("table:first th:eq(" + pos + ")", $t.grid.hDiv);
                    if (nData) {
                        $("div", thecol).html(nData);
                    }
                    if (prop) {
                        if (typeof prop == 'string') {
                            $(thecol).addClass(prop);
                        } else {
                            $(thecol).css(prop);
                        }
                    }
                    if (typeof attrp == 'object') {
                        $(thecol).attr(attrp);
                    }
                }
            });
        };
        $.fn.setCell = function(rowid, colname, nData, cssp, attrp) {
            return this.each(function() {
                var $t = this, pos = -1;
                if (!$t.grid) {
                    return;
                }
                if (isNaN(colname)) {
                    $($t.p.colModel).each(function(i) {
                        if (this.name == colname) {
                            pos = i;
                            return false;
                        }
                    });
                } else {
                    pos = parseInt(colname, 10);
                }
                if (pos >= 0) {
                    var ind = $($t).getInd($t.rows, rowid);
                    if (ind) {
                        var tcell = $("td:eq(" + pos + ")", $t.rows[ind]);
                        if (nData != "") {
                            $t.formatter(tcell, $t.rows[ind], nData, pos, 'edit');
                        }
                        if (cssp) {
                            if (typeof cssp == 'string') {
                                $(tcell).addClass(cssp);
                            } else {
                                $(tcell).css(cssp);
                            }
                        }
                        if (typeof attrp == 'object') {
                            $(tcell).attr(attrp);
                        }
                    }
                }
            });
        };
        $.fn.getCell = function(rowid, col) {
            var ret = false;
            this.each(function() {
                var $t = this, pos = -1;
                if (!$t.grid) {
                    return;
                }
                if (isNaN(col)) {
                    $($t.p.colModel).each(function(i) {
                        if (this.name == col) {
                            pos = i;
                            return false;
                        }
                    });
                } else {
                    pos = parseInt(col, 10);
                }
                if (rowid && pos >= 0) {
                    var ind = $($t).getInd($t.rows, rowid);
                    if (ind) {
                        ret = $.htmlDecode($("td:eq(" + pos + ")", $t.rows[ind]).html());
                    }
                }
            });
            return ret;
        };
        $.fn.clearGridData = function() {
            return this.each(function() {
                var $t = this;
                if (!$t.grid) {
                    return;
                }
                $("tbody tr:gt(0)", $t.grid.bDiv).remove();
                $t.p.selrow = null;
                $t.p.selarrrow = [];
                $t.p.savedRow = [];
                $t.p.records = '0';
                $t.p.page = '0';
                $t.p.lastpage = '0';
                $t.updatepager();
            });
        };
        $.fn.getInd = function(obj, rowid, rc) {
            var ret = false;
            $(obj).each(function(i) {
                if (this.id == rowid) {
                    ret = rc === true ? this : i;
                    return false;
                }
            });
            return ret;
        };
        $.htmlDecode = function(value) {
            if (value == '&nbsp;' || value == '&#160;') {
                value = "";
            }
            return !value ? value : String(value).replace( /&amp;/g , "&").replace( /&gt;/g , ">").replace( /&lt;/g , "<").replace( /&quot;/g , '"');
        };
        return this.each(function() {
            if (this.grid) {
                return;
            }
            this.p = p;
            if (this.p.colNames.length === 0) {
                for (var i = 0; i < this.p.colModel.length; i++) {
                    this.p.colNames[i] = this.p.colModel[i].label || this.p.colModel[i].name;
                }
            }
            if (this.p.colNames.length !== this.p.colModel.length) {
                alert($.jgrid.errors.model);
                return;
            }
            if (this.p.imgpath !== "") {
                this.p.imgpath += "/";
            }
            $("<div class='loadingui' id=lui_" + this.id + "><div class='msgbox'>" + this.p.loadtext + "</div></div>").insertBefore(this);
            $(this).attr({ cellSpacing: "0", cellPadding: "0", border: "0" });
            var ts = this,
                bSR = $.isFunction(this.p.beforeSelectRow) ? this.p.beforeSelectRow : false,
                onSelectRow = $.isFunction(this.p.onSelectRow) ? this.p.onSelectRow : false,
                ondblClickRow = $.isFunction(this.p.ondblClickRow) ? this.p.ondblClickRow : false,
                onSortCol = $.isFunction(this.p.onSortCol) ? this.p.onSortCol : false,
                loadComplete = $.isFunction(this.p.loadComplete) ? this.p.loadComplete : false,
                loadError = $.isFunction(this.p.loadError) ? this.p.loadError : false,
                loadBeforeSend = $.isFunction(this.p.loadBeforeSend) ? this.p.loadBeforeSend : false,
                onRightClickRow = $.isFunction(this.p.onRightClickRow) ? this.p.onRightClickRow : false,
                afterInsRow = $.isFunction(this.p.afterInsertRow) ? this.p.afterInsertRow : false,
                onHdCl = $.isFunction(this.p.onHeaderClick) ? this.p.onHeaderClick : false,
                beReq = $.isFunction(this.p.beforeRequest) ? this.p.beforeRequest : false,
                onSC = $.isFunction(this.p.onCellSelect) ? this.p.onCellSelect : false,
                sortkeys = ["shiftKey", "altKey", "ctrlKey"];
            if ($.inArray(ts.p.multikey, sortkeys) == -1) {
                ts.p.multikey = false;
            }
            var IntNum = function(val, defval) {
                val = parseInt(val, 10);
                if (isNaN(val)) {
                    return (defval) ? defval : 0;
                } else {
                    return val;
                }
            };
            var formatCol = function(elem, pos) {
                var ral = ts.p.colModel[pos].align;
                if (ral) {
                    $(elem).css("text-align", ral);
                }
                if (ts.p.colModel[pos].hidden) {
                    $(elem).css("display", "none");
                }
            };
            var resizeFirstRow = function(t, er) {
                $("tbody tr:eq(" + er + ") td", t).each(function(k) {
                    $(this).css("width", grid.headers[k].width + "px");
                    grid.cols[k] = this;
                });
            };
            var addCell = function(t, row, cell, pos) {
                var td;
                td = document.createElement("td");
                formatter($(td, t), row, cell, pos, 'add');
                row.appendChild(td);
                formatCol($(td, t), pos);
            };
            var formatter = function(elem, row, cellval, colpos, act) {
                var cm = ts.p.colModel[colpos];
                if (cm.formatter) {
                    var opts = { rowId: row.id, colModel: cm, rowData: row };
                    if ($.isFunction(cm.formatter)) {
                        cm.formatter(elem, cellval, opts, act);
                    } else if ($.fmatter) {
                        $(elem).fmatter(cm.formatter, cellval, opts, act);
                    } else {
                        $(elem).html(cellval || '&#160;');
                    }
                } else {
                    $(elem).html(cellval || '&#160;');
                }
                elem[0].title = elem[0].textContent || elem[0].innerText;
            };
            var addMulti = function(t, row) {
                var cbid, td;
                td = document.createElement("td");
                cbid = "jqg_" + row.id;
                $(td, t).html("<input type='checkbox'" + " id='" + cbid + "' class='cbox'/>");
                formatCol($(td, t), 0);
                row.appendChild(td);
            };
            var reader = function(datatype) {
                var field, f = [], j = 0, i;
                for (i = 0; i < ts.p.colModel.length; i++) {
                    field = ts.p.colModel[i];
                    if (field.name !== 'cb' && field.name !== 'subgrid') {
                        f[j] = (datatype == "xml") ? field.xmlmap || field.name : field.jsonmap || field.name;
                        j++;
                    }
                }
                return f;
            };
            var addXmlData = function addXmlData(xml, t, rcnt) {
                if (xml) {
                    var fpos = ts.p.treeANode || 0;
                    rcnt = rcnt || 0;
                    if (fpos === 0 && rcnt === 0) {
                        $("tbody tr:gt(0)", t).remove();
                    }
                } else {
                    return;
                }
                var v, row, gi = 0, si = 0, cbid, idn, getId, f = [], rd = [], cn = (ts.p.altRows === true) ? 'alt' : '';
                if (!ts.p.xmlReader.repeatitems) {
                    f = reader("xml");
                }
                if (ts.p.keyIndex === false) {
                    idn = ts.p.xmlReader.id;
                    if (idn.indexOf("[") === -1) {
                        getId = function(trow, k) { return $(idn, trow).text() || k; };
                    } else {
                        getId = function(trow, k) { return trow.getAttribute(idn.replace( /[\[\]]/g , "")) || k; };
                    }
                } else {
                    getId = function(trow) { return (f.length - 1 >= ts.p.keyIndex) ? $(f[ts.p.keyIndex], trow).text() : $(ts.p.xmlReader.cell + ":eq(" + ts.p.keyIndex + ")", trow).text(); };
                }
                $(ts.p.xmlReader.page, xml).each(function() { ts.p.page = this.textContent || this.text; });
                $(ts.p.xmlReader.total, xml).each(function() { ts.p.lastpage = this.textContent || this.text; });
                $(ts.p.xmlReader.records, xml).each(function() { ts.p.records = this.textContent || this.text; });
                $(ts.p.xmlReader.userdata, xml).each(function() { ts.p.userData[this.getAttribute("name")] = this.textContent || this.text; });
                $(ts.p.xmlReader.root + " " + ts.p.xmlReader.row, xml).each(function(j) {
                    row = document.createElement("tr");
                    row.id = getId(this, j + 1);
                    if (ts.p.multiselect) {
                        addMulti(t, row);
                        gi = 1;
                    }
                    if (ts.p.subGrid) {
                        try {
                            $(ts).addSubGrid(t, row, gi, this);
                        } catch (e) {
                        }
                        si = 1;
                    }
                    if (ts.p.xmlReader.repeatitems === true) {
                        $(ts.p.xmlReader.cell, this).each(function(i) {
                            v = this.textContent || this.text;
                            addCell(t, row, v, i + gi + si);
                            rd[ts.p.colModel[i + gi + si].name] = v;
                        });
                    } else {
                        for (var i = 0; i < f.length; i++) {
                            v = $(f[i], this).text();
                            addCell(t, row, v, i + gi + si);
                            rd[ts.p.colModel[i + gi + si].name] = v;
                        }
                    }
                    if (j % 2 == 1) {
                        row.className = cn;
                    }
                    $(row).addClass("jqgrow");
                    if (ts.p.treeGrid === true) {
                        try {
                            $(ts).setTreeNode(rd, row);
                        } catch (e) {
                        }
                    }
                    $(ts.rows[j + fpos + rcnt]).after(row);
                    if (afterInsRow) {
                        ts.p.afterInsertRow(row.id, rd, this);
                    }
                    rd = [];
                });
                if (isSafari || isOpera) {
                    resizeFirstRow(t, 1);
                }
                if (!ts.p.treeGrid && !ts.p.scroll) {
                    ts.grid.bDiv.scrollTop = 0;
                }
                endReq();
                updatepager();
            };
            var addJSONData = function(data, t, rcnt) {
                if (data) {
                    var fpos = ts.p.treeANode || 0;
                    rcnt = rcnt || 0;
                    if (fpos === 0 && rcnt === 0) {
                        $("tbody tr:gt(0)", t).remove();
                    }
                } else {
                    return;
                }
                var v, i, j, row, f = [], cur, gi = 0, si = 0, drows, idn, rd = [], cn = (ts.p.altRows === true) ? 'alt' : '';
                ts.p.page = data[ts.p.jsonReader.page];
                ts.p.lastpage = data[ts.p.jsonReader.total];
                ts.p.records = data[ts.p.jsonReader.records];
                ts.p.userData = data[ts.p.jsonReader.userdata] || {  };
                if (!ts.p.jsonReader.repeatitems) {
                    f = reader("json");
                }
                if (ts.p.keyIndex === false) {
                    idn = ts.p.jsonReader.id;
                    if (f.length > 0 && !isNaN(idn)) {
                        idn = f[idn];
                    }
                } else {
                    idn = f.length > 0 ? f[ts.p.keyIndex] : ts.p.keyIndex;
                }
                drows = data[ts.p.jsonReader.root];
                if (drows) {
                    for (i = 0; i < drows.length; i++) {
                        cur = drows[i];
                        row = document.createElement("tr");
                        row.id = cur[idn] || "";
                        if (row.id === "") {
                            if (f.length === 0) {
                                if (ts.p.jsonReader.cell) {
                                    var ccur = cur[ts.p.jsonReader.cell];
                                    row.id = ccur[idn] || i + 1;
                                    ccur = null;
                                } else {
                                    row.id = i + 1;
                                }
                            } else {
                                row.id = i + 1;
                            }
                        }
                        if (ts.p.multiselect) {
                            addMulti(t, row);
                            gi = 1;
                        }
                        if (ts.p.subGrid) {
                            try {
                                $(ts).addSubGrid(t, row, gi, drows[i]);
                            } catch (e) {
                            }
                            si = 1;
                        }
                        if (ts.p.jsonReader.repeatitems === true) {
                            if (ts.p.jsonReader.cell) {
                                cur = cur[ts.p.jsonReader.cell];
                            }
                            for (j = 0; j < cur.length; j++) {
                                addCell(t, row, cur[j], j + gi + si);
                                rd[ts.p.colModel[j + gi + si].name] = cur[j];
                            }
                        } else {
                            for (j = 0; j < f.length; j++) {
                                v = cur[f[j]];
                                if (v === undefined) {
                                    try {
                                        v = eval("cur." + f[j]);
                                    } catch (e) {
                                    }
                                }
                                addCell(t, row, v, j + gi + si);
                                rd[ts.p.colModel[j + gi + si].name] = cur[f[j]];
                            }
                        }
                        if (i % 2 == 1) {
                            row.className = cn;
                        }
                        $(row).addClass("jqgrow");
                        if (ts.p.treeGrid === true) {
                            try {
                                $(ts).setTreeNode(rd, row);
                            } catch (e) {
                            }
                        }
                        $(ts.rows[i + fpos + rcnt]).after(row);
                        if (afterInsRow) {
                            ts.p.afterInsertRow(row.id, rd, drows[i]);
                        }
                        rd = [];
                    }
                }
                if (isSafari || isOpera) {
                    resizeFirstRow(t, 1);
                }
                if (!ts.p.treeGrid && !ts.p.scroll) {
                    ts.grid.bDiv.scrollTop = 0;
                }
                endReq();
                updatepager();
            };
            var updatepager = function() {
                if (ts.p.pager) {
                    var cp, last, imp = ts.p.imgpath;
                    if (ts.p.loadonce) {
                        cp = last = 1;
                        ts.p.lastpage = ts.page = 1;
                        $(".selbox", ts.p.pager).attr("disabled", true);
                    } else {
                        cp = IntNum(ts.p.page);
                        last = IntNum(ts.p.lastpage);
                        $(".selbox", ts.p.pager).attr("disabled", false);
                    }
                    if (ts.p.pginput === true) {
                        $('input.selbox', ts.p.pager).val(ts.p.page);
                    }
                    if (ts.p.viewrecords) {
                        if (ts.p.pgtext) {
                            $('#sp_1', ts.p.pager).html(ts.p.pgtext + "&#160;" + ts.p.lastpage);
                        }
                        $('#sp_2', ts.p.pager).html(ts.p.records + "&#160;" + ts.p.recordtext + "&#160;");
                    }
                    if (ts.p.pgbuttons === true) {
                        if (cp <= 0) {
                            cp = last = 1;
                        }
                        if (cp == 1) {
                            $("#first", ts.p.pager).attr({ src: imp + "off-" + ts.p.firstimg, disabled: true });
                        } else {
                            $("#first", ts.p.pager).attr({ src: imp + ts.p.firstimg, disabled: false });
                        }
                        if (cp == 1) {
                            $("#prev", ts.p.pager).attr({ src: imp + "off-" + ts.p.previmg, disabled: true });
                        } else {
                            $("#prev", ts.p.pager).attr({ src: imp + ts.p.previmg, disabled: false });
                        }
                        if (cp == last) {
                            $("#next", ts.p.pager).attr({ src: imp + "off-" + ts.p.nextimg, disabled: true });
                        } else {
                            $("#next", ts.p.pager).attr({ src: imp + ts.p.nextimg, disabled: false });
                        }
                        if (cp == last) {
                            $("#last", ts.p.pager).attr({ src: imp + "off-" + ts.p.lastimg, disabled: true });
                        } else {
                            $("#last", ts.p.pager).attr({ src: imp + ts.p.lastimg, disabled: false });
                        }
                    }
                }
                if ($.isFunction(ts.p.gridComplete)) {
                    ts.p.gridComplete();
                }
            };
            var populate = function() {
                if (!grid.hDiv.loading) {
                    beginReq();
                    var gdata, prm = { nd: (new Date().getTime()), _search: ts.p.search };
                    prm[ts.p.prmNames.rows] = ts.p.rowNum;
                    prm[ts.p.prmNames.page] = ts.p.page;
                    prm[ts.p.prmNames.sort] = ts.p.sortname;
                    prm[ts.p.prmNames.order] = ts.p.sortorder;
                    gdata = $.extend(ts.p.postData, prm);
                    if (ts.p.search === true) {
                        gdata = $.extend(gdata, ts.p.searchdata);
                    }
                    if ($.isFunction(ts.p.datatype)) {
                        ts.p.datatype(gdata);
                        endReq();
                    }
                    var rcnt = ts.p.scroll === false ? 0 : ts.rows.length - 1;
                    switch (ts.p.datatype) {
                    case "json":
                        $.ajax({
                                url: ts.p.url, type: ts.p.mtype, dataType: "json", data: gdata,
                                complete: function(JSON, st) {
                                    if (st == "success") {
                                        addJSONData(eval("(" + JSON.responseText + ")"), ts.grid.bDiv, rcnt);
                                        JSON = null;
                                        if (loadComplete) {
                                            loadComplete();
                                        }
                                    }
                                },
                                error: function(xhr, st, err) {
                                    if (loadError) {
                                        loadError(xhr, st, err);
                                    }
                                    endReq();
                                },
                                beforeSend: function(xhr) {
                                    if (loadBeforeSend) {
                                        loadBeforeSend(xhr);
                                    }
                                }
                            });
                        if (ts.p.loadonce || ts.p.treeGrid) {
                            ts.p.datatype = "local";
                        }
                        break;
                    case "xml":
                        $.ajax({
                                url: ts.p.url, type: ts.p.mtype, dataType: "xml", data: gdata,
                                complete: function(xml, st) {
                                    if (st == "success") {
                                        addXmlData(xml.responseXML, ts.grid.bDiv, rcnt);
                                        xml = null;
                                        if (loadComplete) {
                                            loadComplete();
                                        }
                                    }
                                },
                                error: function(xhr, st, err) {
                                    if (loadError) {
                                        loadError(xhr, st, err);
                                    }
                                    endReq();
                                },
                                beforeSend: function(xhr) {
                                    if (loadBeforeSend) {
                                        loadBeforeSend(xhr);
                                    }
                                }
                            });
                        if (ts.p.loadonce || ts.p.treeGrid) {
                            ts.p.datatype = "local";
                        }
                        break;
                    case "xmlstring":
                        addXmlData(stringToDoc(ts.p.datastr), ts.grid.bDiv);
                        ts.p.datastr = null;
                        ts.p.datatype = "local";
                        if (loadComplete) {
                            loadComplete();
                        }
                        break;
                    case "jsonstring":
                        if (typeof ts.p.datastr == 'string') {
                            ts.p.datastr = eval("(" + ts.p.datastr + ")");
                        }
                        addJSONData(ts.p.datastr, ts.grid.bDiv);
                        ts.p.datastr = null;
                        ts.p.datatype = "local";
                        if (loadComplete) {
                            loadComplete();
                        }
                        break;
                    case "local":
                    case "clientSide":
                        ts.p.datatype = "local";
                        sortArrayData();
                        break;
                    }
                }
            };
            var beginReq = function() {
                if (beReq) {
                    ts.p.beforeRequest();
                }
                grid.hDiv.loading = true;
                switch (ts.p.loadui) {
                case "disable":
                    break;
                case "enable":
                    $("div.loading", grid.hDiv).fadeIn("fast");
                    break;
                case "block":
                    $("#lui_" + ts.id).width($(grid.bDiv).width()).height(IntNum($(grid.bDiv).height()) + IntNum(ts.p._height)).fadeIn("fast");
                    break;
                }
            };
            var endReq = function() {
                grid.hDiv.loading = false;
                switch (ts.p.loadui) {
                case "disable":
                    break;
                case "enable":
                    $("div.loading", grid.hDiv).fadeOut("fast");
                    break;
                case "block":
                    $("#lui_" + ts.id).fadeOut("fast");
                    break;
                }
            };
            var stringToDoc = function(xmlString) {
                var xmlDoc;
                if (typeof xmlString !== 'string') return xmlString;
                try {
                    var parser = new DOMParser();
                    xmlDoc = parser.parseFromString(xmlString, "text/xml");
                } catch (e) {
                    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                    xmlDoc.async = false;
                    xmlDoc["loadXM" + "L"](xmlString);
                }
                return (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.tagName != 'parsererror') ? xmlDoc : null;
            };
            var sortArrayData = function() {
                var stripNum = /[\$,%]/g ;
                var rows = [], col = 0, st, sv, findSortKey, newDir = (ts.p.sortorder == "asc") ? 1 : -1;
                $.each(ts.p.colModel, function(i, v) {
                    if (this.index == ts.p.sortname || this.name == ts.p.sortname) {
                        col = ts.p.lastsort = i;
                        st = this.sorttype;
                        return false;
                    }
                });
                if (st == 'float' || st == 'number' || st == 'currency') {
                    findSortKey = function($cell) {
                        var key = parseFloat($cell.replace(stripNum, ''));
                        return isNaN(key) ? 0 : key;
                    };
                } else if (st == 'int' || st == 'integer') {
                    findSortKey = function($cell) {
                        return IntNum($cell.replace(stripNum, ''));
                    };
                } else if (st == 'date') {
                    findSortKey = function($cell) {
                        var fd = ts.p.colModel[col].datefmt || "Y-m-d";
                        return parseDate(fd, $cell).getTime();
                    };
                } else {
                    findSortKey = function($cell) {
                        return $.trim($cell.toUpperCase());
                    };
                }
                $.each(ts.rows, function(index, row) {
                    if (index > 0) {
                        try {
                            sv = $.unformat($(row).children('td').eq(col), { colModel: ts.p.colModel[col] }, col, true);
                        } catch (_) {
                            sv = $(row).children('td').eq(col).text();
                        }
                        row.sortKey = findSortKey(sv);
                        rows[index - 1] = this;
                    }
                });
                if (ts.p.treeGrid) {
                    $(ts).SortTree(newDir);
                } else {
                    rows.sort(function(a, b) {
                        if (a.sortKey < b.sortKey) {
                            return -newDir;
                        }
                        if (a.sortKey > b.sortKey) {
                            return newDir;
                        }
                        return 0;
                    });
                    $.each(rows, function(index, row) {
                        $('tbody', ts.grid.bDiv).append(row);
                        row.sortKey = null;
                    });
                }
                if (isSafari || isOpera) {
                    resizeFirstRow(ts.grid.bDiv, 1);
                }
                if (ts.p.multiselect) {
                    $("tbody tr:gt(0)", ts.grid.bDiv).removeClass("selected");
                    $("[id^=jqg_]", ts.rows).attr("checked", false);
                    $("#cb_jqg", ts.grid.hDiv).attr("checked", false);
                    ts.p.selarrrow = [];
                }
                if (ts.p.altRows === true) {
                    $("tbody tr:gt(0)", ts.grid.bDiv).removeClass("alt");
                    $("tbody tr:odd", ts.grid.bDiv).addClass("alt");
                }
                ts.grid.bDiv.scrollTop = 0;
                endReq();
            };
            var parseDate = function(format, date) {
                var tsp = { m: 1, d: 1, y: 1970, h: 0, i: 0, s: 0 };
                format = format.toLowerCase();
                date = date.split( /[\\\/:_;.\s-]/ );
                format = format.split( /[\\\/:_;.\s-]/ );
                for (var i = 0; i < format.length; i++) {
                    tsp[format[i]] = IntNum(date[i], tsp[format[i]]);
                }
                tsp.m = parseInt(tsp.m, 10) - 1;
                var ty = tsp.y;
                if (ty >= 70 && ty <= 99) {
                    tsp.y = 1900 + tsp.y;
                } else if (ty >= 0 && ty <= 69) {
                    tsp.y = 2000 + tsp.y;
                }
                return new Date(tsp.y, tsp.m, tsp.d, tsp.h, tsp.i, tsp.s, 0);
            };
            var setPager = function() {
                var inpt = "<img class='pgbuttons' src='" + ts.p.imgpath + "spacer.gif'",
                    pginp = (ts.p.pginput === true) ? "<input class='selbox' type='text' size='3' maxlength='5' value='0'/>" : "",
                    pgl = "", pgr = "", str;
                if (ts.p.viewrecords === true) {
                    pginp += "<span id='sp_1'></span>&#160;";
                }
                if (ts.p.pgbuttons === true) {
                    pgl = inpt + " id='first'/>&#160;&#160;" + inpt + " id='prev'/>&#160;";
                    pgr = inpt + " id='next' />&#160;&#160;" + inpt + " id='last'/>";
                }
                $(ts.p.pager).append(pgl + pginp + pgr);
                if (ts.p.rowList.length > 0) {
                    str = "<SELECT class='selbox'>";
                    for (var i = 0; i < ts.p.rowList.length; i++) {
                        str += "<OPTION value=" + ts.p.rowList[i] + ((ts.p.rowNum == ts.p.rowList[i]) ? ' selected' : '') + ">" + ts.p.rowList[i];
                    }
                    str += "</SELECT>";
                    $(ts.p.pager).append("&#160;" + str + "&#160;<span id='sp_2'></span>");
                    $(ts.p.pager).find("select").bind('change', function() {
                        ts.p.rowNum = (this.value > 0) ? this.value : ts.p.rowNum;
                        if (typeof ts.p.onPaging == 'function') {
                            ts.p.onPaging('records');
                        }
                        populate();
                        ts.p.selrow = null;
                    });
                } else {
                    $(ts.p.pager).append("&#160;<span id='sp_2'></span>");
                }
                if (ts.p.pgbuttons === true) {
                    $(".pgbuttons", ts.p.pager).mouseover(function(e) {
                        if ($(this).attr('disabled') == 'true') {
                            this.style.cursor = 'auto';
                        } else {
                            this.style.cursor = "pointer";
                        }
                        return false;
                    }).mouseout(function(e) {
			    this.style.cursor = "default";
			    return false;
			});
                    $("#first, #prev, #next, #last", ts.p.pager).click(function(e) {
                        var cp = IntNum(ts.p.page),
                            last = IntNum(ts.p.lastpage), selclick = false,
                            fp = true, pp = true, np = true, lp = true;
                        if (last === 0 || last === 1) {
                            fp = false;
                            pp = false;
                            np = false;
                            lp = false;
                        } else if (last > 1 && cp >= 1) {
                            if (cp === 1) {
                                fp = false;
                                pp = false;
                            } else if (cp > 1 && cp < last) {
                            } else if (cp === last) {
                                np = false;
                                lp = false;
                            }
                        } else if (last > 1 && cp === 0) {
                            np = false;
                            lp = false;
                            cp = last - 1;
                        }
                        if (this.id === 'first' && fp) {
                            ts.p.page = 1;
                            selclick = true;
                        }
                        if (this.id === 'prev' && pp) {
                            ts.p.page = (cp - 1);
                            selclick = true;
                        }
                        if (this.id === 'next' && np) {
                            ts.p.page = (cp + 1);
                            selclick = true;
                        }
                        if (this.id === 'last' && lp) {
                            ts.p.page = last;
                            selclick = true;
                        }
                        if (selclick) {
                            if (typeof ts.p.onPaging == 'function') {
                                ts.p.onPaging(this.id);
                            }
                            populate();
                            ts.p.selrow = null;
                            if (ts.p.multiselect) {
                                ts.p.selarrrow = [];
                                $('#cb_jqg', ts.grid.hDiv).attr("checked", false);
                            }
                            ts.p.savedRow = [];
                        }
                        e.stopPropagation();
                        return false;
                    });
                }
                if (ts.p.pginput === true) {
                    $('input.selbox', ts.p.pager).keypress(function(e) {
                        var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
                        if (key == 13) {
                            ts.p.page = ($(this).val() > 0) ? $(this).val() : ts.p.page;
                            if (typeof ts.p.onPaging == 'function') {
                                ts.p.onPaging('user');
                            }
                            populate();
                            ts.p.selrow = null;
                            return false;
                        }
                        return this;
                    });
                }
            };
            var sortData = function(index, idxcol, reload) {
                var imgs, so, scg, ls, iId;
                if (ts.p.savedRow.length > 0) {
                    return;
                }
                if (!reload) {
                    if (ts.p.lastsort === idxcol) {
                        if (ts.p.sortorder === 'asc') {
                            ts.p.sortorder = 'desc';
                        } else if (ts.p.sortorder === 'desc') {
                            ts.p.sortorder = 'asc';
                        }
                    } else {
                        ts.p.sortorder = 'asc';
                    }
                    ts.p.page = 1;
                }
                imgs = (ts.p.sortorder === 'asc') ? ts.p.sortascimg : ts.p.sortdescimg;
                imgs = "<img src='" + ts.p.imgpath + imgs + "'>";
                var thd = $("thead:first", grid.hDiv).get(0);
                ls = ts.p.colModel[ts.p.lastsort].name.replace('.', "\\.");
                $("tr th div#jqgh_" + ls + " img", thd).remove();
                $("tr th div#jqgh_" + ls, thd).parent().removeClass(ts.p.sortclass);
                iId = index.replace('.', "\\.");
                $("tr th div#" + iId, thd).append(imgs).parent().addClass(ts.p.sortclass);
                ts.p.lastsort = idxcol;
                index = index.substring(5);
                ts.p.sortname = ts.p.colModel[idxcol].index || index;
                so = ts.p.sortorder;
                if (onSortCol) {
                    onSortCol(index, idxcol, so);
                }
                if (ts.p.datatype == "local") {
                    if (ts.p.deselectAfterSort) {
                        $(ts).resetSelection();
                    }
                } else {
                    ts.p.selrow = null;
                    if (ts.p.multiselect) {
                        $("#cb_jqg", ts.grid.hDiv).attr("checked", false);
                    }
                    ts.p.selarrrow = [];
                    ts.p.savedRow = [];
                }
                scg = ts.p.scroll;
                if (ts.p.scroll === true) {
                    ts.p.scroll = false;
                }
                populate();
                if (ts.p.sortname != index && idxcol) {
                    ts.p.lastsort = idxcol;
                }
                setTimeout(function() { ts.p.scroll = scg; }, 500);
            };
            var setColWidth = function() {
                var initwidth = 0;
                for (var l = 0; l < ts.p.colModel.length; l++) {
                    if (!ts.p.colModel[l].hidden) {
                        initwidth += IntNum(ts.p.colModel[l].width);
                    }
                }
                var tblwidth = ts.p.width ? ts.p.width : initwidth;
                for (l = 0; l < ts.p.colModel.length; l++) {
                    if (!ts.p.shrinkToFit) {
                        ts.p.colModel[l].owidth = ts.p.colModel[l].width;
                    }
                    ts.p.colModel[l].width = Math.round(tblwidth / initwidth * ts.p.colModel[l].width);
                }
            };
            var nextVisible = function(iCol) {
                var ret = iCol, j = iCol, i;
                for (i = iCol + 1; i < ts.p.colModel.length; i++) {
                    if (ts.p.colModel[i].hidden !== true) {
                        j = i;
                        break;
                    }
                }
                return j - ret;
            };
            this.p.id = this.id;
            if (this.p.treeGrid === true) {
                this.p.subGrid = false;
                this.p.altRows = false;
                this.p.pgbuttons = false;
                this.p.pginput = false;
                this.p.multiselect = false;
                this.p.rowList = [];
                try {
                    $(this).setTreeGrid();
                    this.p.treedatatype = this.p.datatype;
                    $.each(this.p.treeReader, function(i, n) {
                        if (n) {
                            ts.p.colNames.push(n);
                            ts.p.colModel.push({ name: n, width: 1, hidden: true, sortable: false, resizable: false, hidedlg: true, editable: true, search: false });
                        }
                    });
                } catch (_) {
                }
            }
            ts.p.keyIndex = false;
            for (var i = 0; i < ts.p.colModel.length; i++) {
                if (ts.p.colModel[i].key === true) {
                    ts.p.keyIndex = i;
                    break;
                }
            }
            if (this.p.subGrid) {
                this.p.colNames.unshift("");
                this.p.colModel.unshift({ name: 'subgrid', width: 25, sortable: false, resizable: false, hidedlg: true, search: false });
            }
            if (this.p.multiselect) {
                this.p.colNames.unshift("<input id='cb_jqg' class='cbox' type='checkbox'/>");
                this.p.colModel.unshift({ name: 'cb', width: 27, sortable: false, resizable: false, hidedlg: true, search: false });
            }
            var xReader = {
                root: "rows",
                row: "row",
                page: "rows>page",
                total: "rows>total",
                records: "rows>records",
                repeatitems: true,
                cell: "cell",
                id: "[id]",
                userdata: "userdata",
                subgrid: { root: "rows", row: "row", repeatitems: true, cell: "cell" }
            };
            var jReader = {
                root: "rows",
                page: "page",
                total: "total",
                records: "records",
                repeatitems: true,
                cell: "cell",
                id: "id",
                userdata: "userdata",
                subgrid: { root: "rows", repeatitems: true, cell: "cell" }
            };
            if (ts.p.scroll === true) {
                ts.p.pgbuttons = false;
                ts.p.pginput = false;
                ts.p.pgtext = false;
                ts.p.rowList = [];
            }
            ts.p.xmlReader = $.extend(xReader, ts.p.xmlReader);
            ts.p.jsonReader = $.extend(jReader, ts.p.jsonReader);
            $.each(ts.p.colModel, function(i) { this.width = IntNum(this.width, 150); });
            if (ts.p.width) {
                setColWidth();
            }
            var thead = document.createElement("thead");
            var trow = document.createElement("tr");
            thead.appendChild(trow);
            var i = 0, th, idn, thdiv;
            if (ts.p.shrinkToFit === true && ts.p.forceFit === true) {
                for (i = ts.p.colModel.length - 1; i >= 0; i--) {
                    if (!ts.p.colModel[i].hidden) {
                        ts.p.colModel[i].resizable = false;
                        break;
                    }
                }
            }
            for (i = 0; i < this.p.colNames.length; i++) {
                th = document.createElement("th");
                idn = ts.p.colModel[i].name;
                thdiv = document.createElement("div");
                $(thdiv).html(ts.p.colNames[i] + "&#160;");
                if (idn == ts.p.sortname) {
                    var imgs = (ts.p.sortorder === 'asc') ? ts.p.sortascimg : ts.p.sortdescimg;
                    imgs = "<img src='" + ts.p.imgpath + imgs + "'>";
                    $(thdiv).append(imgs);
                    ts.p.lastsort = i;
                    $(th).addClass(ts.p.sortclass);
                }
                thdiv.id = "jqgh_" + idn;
                th.appendChild(thdiv);
                trow.appendChild(th);
            }
            if (this.p.multiselect) {
                var onSA = true;
                if (typeof ts.p.onSelectAll !== 'function') {
                    onSA = false;
                }
                $('#cb_jqg', trow).click(function() {
                    var chk;
                    if (this.checked) {
                        $("[id^=jqg_]", ts.rows).attr("checked", true);
                        $(ts.rows).slice(1).each(function(i) {
                            if (!$(this).hasClass("subgrid")) {
                                $(this).addClass("selected");
                                ts.p.selarrrow[i] = ts.p.selrow = this.id;
                            }
                        });
                        chk = true;
                    } else {
                        $("[id^=jqg_]", ts.rows).attr("checked", false);
                        $(ts.rows).slice(1).each(function(i) {
                            if (!$(this).hasClass("subgrid")) {
                                $(this).removeClass("selected");
                            }
                        });
                        ts.p.selarrrow = [];
                        ts.p.selrow = null;
                        chk = false;
                    }
                    if (onSA) {
                        ts.p.onSelectAll(ts.p.selarrrow, chk);
                    }
                });
            }
            this.appendChild(thead);
            thead = $("thead:first", ts).get(0);
            var w, res, sort;
            $("tr:first th", thead).each(function(j) {
                w = ts.p.colModel[j].width;
                if (typeof ts.p.colModel[j].resizable === 'undefined') {
                    ts.p.colModel[j].resizable = true;
                }
                res = document.createElement("span");
                $(res).html("&#160;");
                if (ts.p.colModel[j].resizable) {
                    $(this).addClass(ts.p.resizeclass);
                    $(res).mousedown(function(e) {
                        if (ts.p.forceFit === true) {
                            ts.p.nv = nextVisible(j);
                        }
                        grid.dragStart(j, e.clientX);
                        e.preventDefault();
                        return false;
                    });
                } else {
                    res = "";
                }
                $(this).css("width", w + "px").prepend(res);
                if (ts.p.colModel[j].hidden) {
                    $(this).css("display", "none");
                }
                grid.headers[j] = { width: w, el: this };
                sort = ts.p.colModel[j].sortable;
                if (typeof sort !== 'boolean') {
                    sort = true;
                }
                if (sort) {
                    $("div", this).css("cursor", "pointer")
    				    .click(function() {
				    sortData(this.id, j);
				    return false;
				});
                }
            });
            var isMSIE = $.browser.msie ? true : false,
                isMoz = $.browser.mozilla ? true : false,
                isOpera = $.browser.opera ? true : false,
                isSafari = $.browser.safari ? true : false,
                td, ptr, gw = 0, hdc = 0, tbody = document.createElement("tbody");
            trow = document.createElement("tr");
            trow.id = "_empty";
            tbody.appendChild(trow);
            for (i = 0; i < ts.p.colNames.length; i++) {
                td = document.createElement("td");
                trow.appendChild(td);
            }
            this.appendChild(tbody);
            $("tbody tr:first td", ts).each(function(ii) {
                w = ts.p.colModel[ii].width;
                $(this).css({ width: w + "px", height: "0px" });
                w += IntNum($(this).css("padding-left")) +
                    IntNum($(this).css("padding-right")) +
                        IntNum($(this).css("border-left-width")) +
                            IntNum($(this).css("border-right-width"));
                if (ts.p.colModel[ii].hidden === true) {
                    $(this).css("display", "none");
                    hdc += w;
                }
                grid.cols[ii] = this;
                gw += w;
            });
            if (isMoz) {
                $(trow).css({ visibility: "collapse" });
            } else if (isSafari || isOpera) {
                $(trow).css({ display: "none" });
            }
            grid.width = IntNum(gw) - IntNum(hdc);
            ts.p._width = grid.width;
            grid.hTable = document.createElement("table");
            $(grid.hTable).append(thead)
    		    .css({ width: grid.width + "px" })
    		    .attr({ cellSpacing: "0", cellPadding: "0", border: "0" })
    		    .addClass("scroll grid_htable");
            grid.hDiv = document.createElement("div");
            var hg = (ts.p.caption && ts.p.hiddengrid === true) ? true : false;
            $(grid.hDiv)
    			    .css({ width: grid.width + "px", overflow: "hidden" })
    			    .prepend('<div class="loading">' + ts.p.loadtext + '</div>')
    			    .addClass("grid_hdiv")
    			    .append(grid.hTable)
    			    .bind("selectstart", function() { return false; });
            if (hg) {
                $(grid.hDiv).hide();
                ts.p.gridstate = 'hidden';
            }
            if (ts.p.pager) {
                if (typeof ts.p.pager == "string") {
                    if (ts.p.pager.substr(0, 1) != "#") ts.p.pager = "#" + ts.p.pager;
                }
                if ($(ts.p.pager).hasClass("scroll")) {
                    $(ts.p.pager).css({ width: grid.width + "px", overflow: "hidden" }).show();
                    ts.p._height = parseInt($(ts.p.pager).height(), 10);
                    if (hg) {
                        $(ts.p.pager).hide();
                    }
                }
                setPager();
            }
            if (ts.p.cellEdit === false) {
                $(ts).mouseover(function(e) {
                    td = (e.target || e.srcElement);
                    ptr = $(td, ts.rows).parents("tr:first");
                    if ($(ptr).hasClass("jqgrow")) {
                        $(ptr).addClass("over");
                    }
                    return false;
                }).mouseout(function(e) {
		    td = (e.target || e.srcElement);
		    ptr = $(td, ts.rows).parents("tr:first");
		    $(ptr).removeClass("over");
		    return false;
		});
            }
            var ri, ci;

            $(ts).before(grid.hDiv).css("width", grid.width + "px").click(function(e) {
                td = (e.target || e.srcElement);
                if (td.href) {
                    return true;
                }
                var scb = $(td).hasClass("cbox");
                ptr = $(td, ts.rows).parent("tr");
                if ($(ptr).length === 0) {
                    ptr = $(td, ts.rows).parents("tr:first");
                    td = $(td).parents("td:first")[0];
                }
                var cSel = true;
                if (bSR) {
                    cSel = bSR(ptr.attr("id"));
                }
                if (cSel === true) {
                    if (ts.p.cellEdit === true) {
                        if (ts.p.multiselect && scb) {
                            $(ts).setSelection(false, true, ptr);
                        } else {
                            ri = ptr[0].rowIndex;
                            ci = td.cellIndex;
                            try {
                                $(ts).editCell(ri, ci, true, true);
                            } catch (e) {
                            }
                        }
                    } else if (!ts.p.multikey) {
                        if (ts.p.multiselect && ts.p.multiboxonly) {
                            if (scb) {
                                $(ts).setSelection(false, true, ptr);
                            }
                        } else {
                            $(ts).setSelection(false, true, ptr);
                        }
                    } else {
                        if (e[ts.p.multikey]) {
                            $(ts).setSelection(false, true, ptr);
                        } else if (ts.p.multiselect && scb) {
                            scb = $("[id^=jqg_]", ptr).attr("checked");
                            $("[id^=jqg_]", ptr).attr("checked", !scb);
                        }
                    }
                    if (onSC) {
                        ri = ptr[0].id;
                        ci = td.cellIndex;
                        onSC(ri, ci, $(td).html());
                    }
                }
                e.stopPropagation();
            }).bind('reloadGrid', function(e) {
                if (ts.p.treeGrid === true) {
                    ts.p.datatype = ts.p.treedatatype;
                }
                if (ts.p.datatype == "local") {
                    $(ts).resetSelection();
                } else if (!ts.p.treeGrid) {
                    ts.p.selrow = null;
                    if (ts.p.multiselect) {
                        ts.p.selarrrow = [];
                        $('#cb_jqg', ts.grid.hDiv).attr("checked", false);
                    }
                    if (ts.p.cellEdit) {
                        ts.p.savedRow = [];
                    }
                }
                populate();
            });
            if (ondblClickRow) {
                $(this).dblclick(function(e) {
                    td = (e.target || e.srcElement);
                    ptr = $(td, ts.rows).parent("tr");
                    if ($(ptr).length === 0) {
                        ptr = $(td, ts.rows).parents("tr:first");
                    }
                    ts.p.ondblClickRow($(ptr).attr("id"));
                    return false;
                });
            }
            if (onRightClickRow) {
                $(this).bind('contextmenu', function(e) {
                    td = (e.target || e.srcElement);
                    ptr = $(td, ts).parents("tr:first");
                    if ($(ptr).length === 0) {
                        ptr = $(td, ts.rows).parents("tr:first");
                    }
                    if (!ts.p.multiselect) {
                        $(ts).setSelection(false, true, ptr);
                    }
                    ts.p.onRightClickRow($(ptr).attr("id"));
                    return false;
                });
            }
            grid.bDiv = document.createElement("div");
            var ofl2 = (isNaN(ts.p.height) && isMoz && (ts.p.height.indexOf("%") != -1 || ts.p.height == "auto")) ? "hidden" : "auto";
            $(grid.bDiv)
    			    .addClass("grid_bdiv")
    			    .scroll(function(e) { grid.scrollGrid(); })
    			    .css({ height: ts.p.height + (isNaN(ts.p.height) ? "" : "px"), padding: "0px", margin: "0px", overflow: ofl2, width: (grid.width) + "px" }).css("overflow-x", "hidden")
    			    .append(this);
            $("table:first", grid.bDiv).css({ width: grid.width + "px" });
            if (isMSIE) {
                if ($("tbody", this).size() === 2) {
                    $("tbody:first", this).remove();
                }
                if (ts.p.multikey) {
                    $(grid.bDiv).bind("selectstart", function() { return false; });
                }
                if (ts.p.treeGrid) {
                    $(grid.bDiv).css("position", "relative");
                }
            } else {
                if (ts.p.multikey) {
                    $(grid.bDiv).bind("mousedown", function() { return false; });
                }
            }
            if (hg) {
                $(grid.bDiv).hide();
            }
            grid.cDiv = document.createElement("div");
            $(grid.cDiv).append("<table class='Header' cellspacing='0' cellpadding='0' border='0'><tr><td class='HeaderLeft'><img src='" + ts.p.imgpath + "spacer.gif' border='0' /></td><th>" + ts.p.caption + "</th>" + ((ts.p.hidegrid === true) ? "<td class='HeaderButton'><img src='" + ts.p.imgpath + "up.gif' border='0'/></td>" : "") + "<td class='HeaderRight'><img src='" + ts.p.imgpath + "spacer.gif' border='0' /></td></tr></table>")
    		    .addClass("GridHeader").width(grid.width);
            $(grid.cDiv).insertBefore(grid.hDiv);
            if (ts.p.toolbar[0]) {
                grid.uDiv = document.createElement("div");
                if (ts.p.toolbar[1] == "top") {
                    $(grid.uDiv).insertBefore(grid.hDiv);
                } else {
                    $(grid.uDiv).insertAfter(grid.hDiv);
                }
                $(grid.uDiv).width(grid.width).addClass("userdata").attr("id", "t_" + this.id);
                ts.p._height += parseInt($(grid.uDiv).height(), 10);
                if (hg) {
                    $(grid.uDiv).hide();
                }
            }
            if (ts.p.caption) {
                ts.p._height += parseInt($(grid.cDiv, ts).height(), 10);
                var tdt = ts.p.datatype;
                if (ts.p.hidegrid === true) {
                    $(".HeaderButton", grid.cDiv).toggle(function() {
                        if (ts.p.pager) {
                            $(ts.p.pager).slideUp();
                        }
                        if (ts.p.toolbar[0]) {
                            $(grid.uDiv, ts).slideUp();
                        }
                        $(grid.bDiv).hide();
                        $(grid.hDiv).slideUp();
                        $("img", this).attr("src", ts.p.imgpath + "down.gif");
                        ts.p.gridstate = 'hidden';
                        if (onHdCl) {
                            if (!hg) {
                                ts.p.onHeaderClick(ts.p.gridstate);
                            }
                        }
                    },
                        function() {
                            $(grid.hDiv).slideDown();
                            $(grid.bDiv).show();
                            if (ts.p.pager) {
                                $(ts.p.pager).slideDown();
                            }
                            if (ts.p.toolbar[0]) {
                                $(grid.uDiv).slideDown();
                            }
                            $("img", this).attr("src", ts.p.imgpath + "up.gif");
                            if (hg) {
                                ts.p.datatype = tdt;
                                populate();
                                hg = false;
                            }
                            ts.p.gridstate = 'visible';
                            if (onHdCl) {
                                ts.p.onHeaderClick(ts.p.gridstate);
                            }
                        }
				);
                    if (hg) {
                        $(".HeaderButton", grid.cDiv).trigger("click");
                        ts.p.datatype = "local";
                    }
                }
            } else {
                $(grid.cDiv).hide();
            }
            ts.p._height += parseInt($(grid.hDiv, ts).height(), 10);
            $(grid.hDiv).mousemove(function(e) {
                grid.dragMove(e.clientX);
                return false;
            }).after(grid.bDiv);
            $(document).mouseup(function(e) {
                if (grid.resizing) {
                    grid.dragEnd();
                    if (grid.newWidth && ts.p.forceFit === false) {
                        var gwdt = (grid.width <= ts.p._width) ? grid.width : ts.p._width;
                        var overfl = (grid.width <= ts.p._width) ? "hidden" : "auto";
                        if (ts.p.pager && $(ts.p.pager).hasClass("scroll")) {
                            $(ts.p.pager).width(gwdt);
                        }
                        if (ts.p.caption) {
                            $(grid.cDiv).width(gwdt);
                        }
                        if (ts.p.toolbar[0]) {
                            $(grid.uDiv).width(gwdt);
                        }
                        $(grid.bDiv).width(gwdt).css("overflow-x", overfl);
                        $(grid.hDiv).width(gwdt);
                    }
                }
                return false;
            });
            ts.formatCol = function(a, b) { formatCol(a, b); };
            ts.sortData = function(a, b, c) { sortData(a, b, c); };
            ts.updatepager = function() { updatepager(); };
            ts.formatter = function(elem, row, cellval, colpos, act) { formatter(elem, row, cellval, colpos, act); };
            $.extend(grid, { populate: function() { populate(); } });
            this.grid = grid;
            ts.addXmlData = function(d) { addXmlData(d, ts.grid.bDiv); };
            ts.addJSONData = function(d) { addJSONData(d, ts.grid.bDiv); };
            populate();
            if (!ts.p.shrinkToFit) {
                ts.p.forceFit = false;
                $("tr:first th", thead).each(function(j) {
                    var w = ts.p.colModel[j].owidth;
                    var diff = w - ts.p.colModel[j].width;
                    if (diff > 0 && !ts.p.colModel[j].hidden) {
                        grid.headers[j].width = w;
                        $(this).add(grid.cols[j]).width(w);
                        $('table:first', grid.bDiv).add(grid.hTable).width(ts.grid.width);
                        ts.grid.width += diff;
                        grid.hDiv.scrollLeft = grid.bDiv.scrollLeft;
                    }
                });
                ofl2 = (grid.width <= ts.p._width) ? "hidden" : "auto";
                $(grid.bDiv).css({ "overflow-x": ofl2 });
            }
            $(window).unload(function() {
                $(this).unbind("*");
                this.grid = null;
                this.p = null;
            });
        });
    };
})(jQuery);